home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 3 / Amiga Tools 3.iso / rexx / random.pvrx < prev    next >
Text File  |  1994-01-26  |  6KB  |  219 lines

  1. /***************************************************************************
  2. *                                                                          *
  3. *  $VER: Random.pvrx 1.0 (26.Jan.94)                                       *
  4. *   Copyright © 1994 by Stylus, Inc.                                       *
  5. *   Author:  Jeff Blume                                                    *
  6. *                                                                          *
  7. *   This macro clones selected objects and randomly distributes them,      *
  8. *   with rotation and scaling.  There is a slight bias in distribution     *
  9. *   (to the upper-left). This bias is less perceptible as the number of    *
  10. *   clones increases.  Sixty clones shows little bias; 55 is noticeably    *
  11. *   more biased.  NOTE: the bias can be flipped on either axis; see the    *
  12. *   comments in the RANPOS: routine.                                       *
  13. *                                                                          *
  14. ***************************************************************************/
  15.  
  16. /*
  17. call open STDOUT,"RAM:RxOut.txt",W
  18. call open STDERR,"RAM:RxErr.txt",W
  19. trace R
  20. */
  21.  
  22. options results
  23.  
  24. /* Lock ProVector - wait if necessary */
  25. 'Lock Wait'
  26.  
  27. /* Get selected objs; if none exit; otherwise find center of BBOX */
  28. 'SelectList Sel';    NumSel = Result
  29. if NumSel = 0 then call Error "No objects selected!"
  30. 'SelExtent' Ext
  31. CX = (Ext.X1 + Ext.X2) / 2
  32. CY = (Ext.Y1 + Ext.Y2) / 2
  33.  
  34. call Request
  35.  
  36. 'PushUndo'
  37. do j=0 for NumSel
  38.     do i=1 for NumClones
  39.         call RanPos
  40.         'Clone' Sel.j DX DY;    Clone = Result
  41.         if ScaleClones = 1 then do
  42.             call RanScale
  43.             'Size' Clone (CX+DX) (CY+DY) ScaleFactor ScaleFactor
  44.         end
  45.         if RotClones = 1 then do
  46.             call RanRot
  47.             'Rotate' Clone (CX+DX) (CY+DY) Degrees
  48.         end
  49.     end
  50.     if DelOrig = 1 then 'Delete' Sel.j
  51. end
  52. if ScaleClones = 1 | RotClones = 1 then 'Repair'
  53.  
  54. call CleanUp
  55.  
  56.  
  57. ERROR:
  58.     arg ErrTxt
  59.     'GetBool ErrTxt "Cancel" "Cancel"'
  60. CLEANUP:
  61.     'UnLock'
  62.     EXIT
  63.  
  64.  
  65. RANPOS:
  66.     call Limits
  67.     DX = random(0,MaxDX)
  68.     DX = DX/ (10 ** Xidx)        /* Restore decimal (approximately :^) */
  69.     if random(0,1) = 0 then DX = -DX    /* Random() is BIASED TO 0 */
  70.     DY = random(0,MaxDY)
  71.     DY = DY / (10 ** Yidx)        /* Restore decimal (approximately :^) */
  72.     if random(0,1) = 1 then DY = -DY    /* Random() is BIASED TO 0 */
  73.     /* Random() is biased to zero; thus, current random sign values bias
  74.        to upper-left.  Specifically (likewise the converse):  
  75.        DX sign ran()=0 biases to left
  76.        DY sign ran() 1 biases to top */
  77. return
  78.  
  79.  
  80. LIMITS:
  81.     'GetPageDims' PDims
  82.     /* Shift decimal to convert to 3 digit integer for Random() */
  83.     numeric digits 3
  84.     MaxDX = PDims.Width / 2
  85.     Xidx = index(MaxDX,".")
  86.     if Xidx ~= 0 then MaxDX = MaxDX * (10 ** Xidx)
  87.     MaxDY = PDims.Height / 2
  88.     Yidx = index(MaxDY,".")
  89.     if Yidx ~= 0 then MaxDY = MaxDY * (10 ** Yidx)
  90.     numeric digits 9        /* 3 DIGITS NOT SOURCE OF BIAS */
  91. return                        /* in fact, little diff either way */
  92.  
  93.  
  94. RANSCALE:
  95.     /* Limit ScaleFactor from .5 to 2 */
  96.     /*ScaleFactor = random(5,20)*/
  97.     /* Limit ScaleFactor from .1 to 1.5 */
  98.     ScaleFactor = random(1,15)
  99.     ScaleFactor = ScaleFactor/10
  100. return
  101.  
  102.  
  103. RANROT:
  104.     Degrees = random(1,360)
  105. return
  106.  
  107.  
  108. REQUEST:
  109. if show("P","REXXREQUEST") then
  110.     do
  111.         call DefGads
  112.         address REXXREQUEST 'GetRequest Gads'; OK=Result
  113.         if OK > 0 then    /* The user didn't cancel the requester... */
  114.             do
  115.                 NumClones = Gads.3.Value
  116.                 ScaleClones = Gads.4.Value
  117.                 RotClones = Gads.5.Value
  118.                 DelOrig = Gads.6.Value
  119.             end    /* end if do */
  120.         else call CleanUp    /* User canceled */
  121.     end
  122. else call error "No REXXRequest"
  123. return
  124.  
  125.  
  126. DEFGADS:
  127. /* Define PubScreen */
  128. Gads.PubScreen = "PROVECTOR"
  129.  
  130. /* Window */ 
  131. Gads.0.LeftEdge = 166; Gads.0.TopEdge = 70
  132. Gads.0.Width = 241; Gads.0.Height = 98
  133. Gads.0.Label = "Random Clones"
  134.  
  135. /* OK button */
  136. Gads.1.LeftEdge = 16; Gads.1.TopEdge = 76
  137. Gads.1.Width = 64; Gads.1.Height = 12
  138. Gads.1.Type = Button; Gads.1.Label = "OK"; Gads.1.EndGad = 1
  139.  
  140. /* CANCEL button */
  141. Gads.2.LeftEdge = 154; Gads.2.TopEdge = 76
  142. Gads.2.Width = 71; Gads.2.Height = 12
  143. Gads.2.Type = Button; Gads.2.Label = "Cancel"; Gads.2.EndGad = -1
  144.  
  145. /* NumClones Integer Gadget */
  146. Gads.3.LeftEdge = 162; Gads.3.TopEdge = 8
  147. Gads.3.Width = 50; Gads.3.Height = 12
  148. Gads.3.Label = "Number of Clones"
  149. Gads.3.Type = Integer
  150. Gads.3.Size = 4        /* 4 digits */
  151. Gads.3.Active = 1
  152. Gads.3.Value = "60"    /* initial/default */
  153.  
  154. /* Scale Checkbox */
  155. Gads.4.LeftEdge = 26; Gads.4.TopEdge = 24
  156. Gads.4.Width = 158; Gads.4.Height = 12
  157. Gads.4.Label = "Scale Clones"
  158. Gads.4.Type = Toggle
  159. Gads.4.Value = "1"    /* initial/default */
  160.  
  161. /* Rotate Checkbox */
  162. Gads.5.LeftEdge = 26; Gads.5.TopEdge = 39
  163. Gads.5.Width = 158; Gads.5.Height = 1
  164. Gads.5.Label = "Rotate Clones"
  165. Gads.5.Type = Toggle
  166. Gads.5.Value = "1"    /* initial/default */
  167.  
  168. /* Delete Checkbox */
  169. Gads.6.LeftEdge = 26; Gads.6.TopEdge = 54
  170. Gads.6.Width = 158; Gads.6.Height = 12
  171. Gads.6.Label = "Delete Original Obj"
  172. Gads.6.Type = Toggle
  173. Gads.6.Value = "1"    /* initial/default */
  174.  
  175. /* Total Gadgets + Window */
  176. Gads.NumGads = 7
  177. return    /* return DefGads */
  178.  
  179.  
  180. /*
  181. SAY "DX = "||DX
  182. SAY "DY = "||DY
  183. SAY "CX = "||CX
  184. SAY "CY = "||CY
  185. SAY ""
  186. */
  187. /*
  188.  
  189. /* Temporary Initialization of variables; later use RexxRequest */
  190. NumClones = 5
  191. MinX = 0;    MaxX = 8.5        /* Later default to */ 
  192. MinY = 0;    MaxY = 11        /*  page size.       */
  193. MinScale = .5;    MaxScale = 2
  194. MinRot = 0;    Maxrot = 360
  195. */
  196.  
  197. /*
  198. do i=1 for NumClones
  199.     do j=0 for NumSel
  200.         /*call RanPos*/
  201.         'Clone' Sel.j DX DY;    Clone = Result
  202.         if ScaleClones = 1 then do
  203.             call RanScale
  204.             'Size' Clone (CX+DX) (CY+DY) ScaleFactor ScaleFactor
  205.         end
  206.         if RotClones = 1 then do
  207.             call RanRot
  208.             'Rotate' Clone (CX+DX) (CY+DY) Degrees
  209.         end
  210. /*** OOOHHH, BAD, BAD, BAD!!! ***/
  211. /* These objs are then cloned AFTER deletion! */
  212.         if DelOrig = 1 then 'Delete' Sel.j
  213. /*        if DelOrig = 1 then 'Delete' Clone */
  214. /*      This deleted ALL the Clones! */
  215. /*** OOOHHH, BAD, BAD, BAD!!! ***/
  216.     end
  217. end
  218. */
  219.